package me.szlx.thing.manager;

import me.szlx.thing.Thing;
import me.szlx.thing.TraitLet;

import java.util.List;
import java.util.Map;

public interface ThingManager<T extends Thing> {
    /**
     * 获取事物对象。如果不存在则抛出异常。
     *
     * @param id 事物标识。
     * @return 事物对象。
     */
    T get(Object id);

    /**
     * 获取符合指定特性的事物列表。如果不存在指定的事物，则为空的列表。
     *
     * @param filters 事物过滤特性。如果为null，则表示不过滤。
     * @return 具有指定特性的事物列表。如果不存在指定的事物，则返回空的列表。
     */
    List<T> list(TraitLet... filters);

    /**
     * @param traitName 特性名称。
     * @param filters   事物过滤特性。如果为null，则表示不过滤。
     * @return
     */
    Map<String, List<T>> group(String traitName, TraitLet... filters);

    /**
     * 判断2个事物对象是否相同。
     * @param t1 事物对象1。
     * @param t2 事物对象2。
     * @return {@code true}，如果两个事物对象都是 {@code null} 或者 Id相等；否则返回{@code false}。
     */
    default boolean isSame(T t1, T t2) {
        if (t1 == t2) return true;
        if (t1 == null || t2 == null) return false;
        return t1.getId().equals(t2.getId());
    }
}